<?php
namespace Common\Util;
class Onemodel {

	// 参数
	public $param;

	// 初始化函数
	public function __construct(){
		$tab = D('setup');
		// 获取参数
		$openid = $tab->where('name="openid"')->getField('val');
		$secret = $tab->where('name="secret"')->getField('val');
		$account = $tab->where('name="account"')->getField('val');
		$this->param['openid'] = $openid; // unserialize($openid)
		$this->param['secret'] = $secret; // unserialize($secret)
		$this->param['account'] = $account; // unserialize($account)
	}

	/**
     * 计算当前页码
     * @access public
     * @param int $total 数据条数
     * @param string $apiName 接口名称
     * @param int $pageSize 页码大小
     * @return array $arr 该拉哪页pageIndex  allPage
     */
	public function calculPage( $total , $apiName , $pageSize = 10 ){

		$arr = array();
		// 当前是哪个接口
		switch ($apiName) {
			case 'Get_MembersPagedV2':
				// user_num为当前拉取到会员列表中的整页数据记录
				$num = $this->calcul_num('user_num');
				break;

			case 'Get_GoodsItemsPagedV2':
				// goods_num为当前拉取到商品列表中的整页数据记录
				$num = $this->calcul_num('goods_num');
				break;

			case 'Get_ConsumeNotePagedV2':
				// line_num为当前拉取到线下订单列表中的整页数据记录
				$num = $this->calcul_num('line_num');
				break;

			case 'Get_GoodsBillPaged':
				// online_num为当前拉取到线上订单中的整页数据记录
				$num = $this->calcul_num('online_num');
				break;

			case 'Get_UserAccountPaged':
				// useraccount_num为当前拉取到工号(用户)列表中的整页数据记录
				$num = $this->calcul_num('useraccount_num');
				break;

			case 'Get_ChainStorePagedV2':
				// chainstore_num为当前拉取到店面列表中的整页数据记录
				$num = $this->calcul_num('chainstore_num');
				break;
			
			default:
				die('请传入接口名称');
				break;
		}
		// 计算当前该取第几页
		$arr['pageIndex'] = empty($num) ? 0 : intval($num / $pageSize);
		// 当前一共多少页
		$arr['allPage'] = ceil($total / $pageSize);

		return $arr;
	}

	/**
     * 读取拉取数据的条数
     * @access public
     * @param string $fieldName 字段名
     * @param int $val 如果为false则为查找 为整数是保存到字段中
     * @return array $res 一卡易返回数据包
     */
	public function calcul_num( $fieldName , $val = false ){
		// 字段不能为空
		if(empty($fieldName)){
			return false;
		}
		// 实例化一卡易的类
		$tab = D('calcul_num');
		// 判断是读取还是保存
		if($val === false){
			$res = $tab->where(array('name'=>$fieldName))->getField('val');
			return isset($res) ? $res : 0 ;
		}else{
			$res = $tab->where(array('name'=>$fieldName))->save(array('val'=>$val));
		}
		return $res;
	}

	/**
     * 调用一卡易接口
     * @access public
     * @param string $apiName 一卡易接口名称
     * @param array $parameter 一卡易接口所需数据
     * @return array $res 一卡易返回数据包
     */
	public function openapi( $apiName , $parameter ){
		// 实例化一卡易的类
		$openApi = new Apiyky($this->param['openid'], $this->param['secret']);
		// 调用一卡易请求数据的接口方法
		$res = $openApi->CallHttpPost($apiName, $parameter);

		return $res;
	}

	/**
     * 获取会员列表接口
     * @access public
     * @param string $pageSize 一页拉取多少条数据
     * @return array $arr 执行状态 status 是否拉取 ispull
     */
	public function de_Get_MembersPagedV2( $pageSize = 10 ){
		// 接口名称
		$apiName = 'Get_MembersPagedV2';
		// 拿取参数
		$set = $this->param;
		// 定义状态数组
		$arr = array(
			'status'=>true, // 执行状态
			'ispull'=>false // 是否拉取
			);


		// 获取单条数据
		$oneApiData = $this->openapi($apiName, array(
					'userAccount' => $set['account'],
					'where' => '1=1',
					'pageIndex' => 0,
					'pageSize' => $pageSize,
					"orderBy" => " RegisterTime asc", 
				));
		// 计算当前需要拉取哪一页数据
		$page = $this->calculPage($oneApiData['total'], $apiName, $pageSize);


		// 循环拉取数据
		if($page['pageIndex'] < $page['allPage']){
			// 获取数据
			$apiData = $this->openapi($apiName, array(
					'userAccount' => $set['account'],
					'where' => '1=1',
					'pageIndex' => $page['pageIndex'],
					'pageSize' => $pageSize,
					"orderBy" => " RegisterTime asc", 
				));
			// 对数据进行验证存在 和 保存
			$table = D('oco_member');
			$time = date('Y-m-d H:i:s', time());
			// 当前日期
			$day = date('Y-m-d', time());
			// 这个月的最后一天
			$lastday = date('Y-m-d', strtotime(date('Y-m-01', time())." +1 month -1 day"));
			foreach ($apiData['data'] as $ak => $av) {
				// 查询数据库有无该条数据
				$tabres = $table->where(array('Guid'=>$av['Guid']))->find();
				// 判断是否是月末
				if($day != $lastday){
					unset($av['AvailablePoint']);
				}
				// 没有则添加
				if( empty($tabres) ){

					$addarr = $av;
					// 记录添加时间(拉取数据时间)
					$addarr['exestat'] = '1';
					$addarr['deaddtime'] = $time;
					$addarr['deedittime'] = $time;
					// 保存数据
					$addres = $table->add($addarr);
				}else{
				// 这可以写如果有数据则更新
					$table->where(array('Guid'=>$av['Guid']))->save($av);
				}
			}

			// 当前页码条件判断是否拉取数据
			if( ($page['allPage'] - $page['pageIndex']) > 1 ){
				// 当前拉取数据记录
				$num = $this->calcul_num('user_num');
				$this->calcul_num('user_num', intval($num + $pageSize));
				// 下次为继续拉取数据
				$arr['ispull'] = true;
			}else{
				// ispull为停止拉取数据
				$arr['ispull'] = false;
			}
		}

		return $arr;
	}

	/**
     * 获取商品列表接口
     * @access public
     * @param string $pageSize 一页拉取多少条数据
     * @return array $arr 执行状态 status 是否拉取 ispull
     */
	public function de_Get_GoodsItemsPagedV2( $pageSize = 10 ){
		// 接口名称
		$apiName = 'Get_GoodsItemsPagedV2';
		// 拿取参数
		$set = $this->param;
		// 定义状态数组
		$arr = array(
			'status'=>true, // 执行状态
			'ispull'=>false // 是否拉取
			);


		// 获取单条数据
		$oneApiData = $this->openapi($apiName, array(
					'userAccount' => $set['account'],
					'where' => '1=1',
					'pageIndex' => 0,
					'pageSize' => $pageSize,
					'orderBy' => " Guid asc",
				));
		// 计算当前需要拉取哪一页数据
		$page = $this->calculPage($oneApiData['total'], $apiName, $pageSize);


		// 循环拉取数据
		if($page['pageIndex'] < $page['allPage']){
			// 获取数据
			$apiData = $this->openapi($apiName, array(
					'userAccount' => $set['account'],
					'where' => '1=1',
					'pageIndex' => $page['pageIndex'],
					'pageSize' => $pageSize,
					'orderBy' => " Guid asc",
				));
			// 对数据进行验证存在 和 保存
			$table = D('oco_goods');
			$time = date('Y-m-d H:i:s', time());
			foreach ($apiData['data'] as $ak => $av) {
				// 查询数据库有无该条数据
				$tabres = $table->where(array('Guid'=>$av['Guid']))->find();
				// 没有则添加
				if( empty($tabres) ){

					$addarr = $av;
					// 记录添加时间(拉取数据时间)
					$addarr['exestat'] = '1';
					$addarr['deaddtime'] = $time;
					$addarr['deedittime'] = $time;
					// 保存数据
					$addres = $table->add($addarr);
				}
				// 这可以写如果有数据则更新
			}

			
			// 当前页码条件判断是否拉取数据
			if( ($page['allPage'] - $page['pageIndex']) > 1 ){
				// 当前拉取数据记录
				$num = $this->calcul_num('goods_num');
				$this->calcul_num('goods_num', intval($num + $pageSize));
				// 下次为继续拉取数据
				$arr['ispull'] = true;
			}else{
				// ispull为停止拉取数据
				$arr['ispull'] = false;
			}
			
		}

		return $arr;
	}

	/**
     * 获取线下订单接口
     * @access public
     * @param string $pageSize 一页拉取多少条数据
     * @return array $arr 执行状态 status 是否拉取 ispull
     */
	public function de_Get_ConsumeNotePagedV2( $pageSize = 10 ){
		// 接口名称
		$apiName = 'Get_ConsumeNotePagedV2';
		// 拿取参数
		$set = $this->param;
		// 定义状态数组
		$arr = array(
			'status'=>true, // 执行状态
			'ispull'=>false // 是否拉取
			);


		// 获取单条数据
		$oneApiData = $this->openapi($apiName, array(
					'userAccount' => $set['account'],
					'where' => '1=1',
					'pageIndex' => 0,
					'pageSize' => $pageSize,
					'orderBy' => " BillNumber asc",
				));
		// 计算当前需要拉取哪一页数据
		$page = $this->calculPage($oneApiData['total'], $apiName, $pageSize);


		// 循环拉取数据
		if($page['pageIndex'] < $page['allPage']){
			// 获取数据
			$apiData = $this->openapi($apiName, array(
					'userAccount' => $set['account'],
					'where' => '1=1',
					'pageIndex' => $page['pageIndex'],
					'pageSize' => $pageSize,
					'orderBy' => " BillNumber asc",
				));
			// 对数据进行验证存在 和 保存
			$table = D('oco_line_consume');
			$time = date('Y-m-d H:i:s', time());
			foreach ($apiData['data'] as $ak => $av) {
				// 查询数据库有无该条数据
				$tabres = $table->where(array('Guid'=>$av['Guid']))->find();
				// 没有则添加
				if( empty($tabres) ){

					$addarr = $av;
					// 记录添加时间(拉取数据时间)
					$addarr['exestat'] = '1';
					$addarr['deaddtime'] = $time;
					$addarr['deedittime'] = $time;
					// 保存数据
					$addres = $table->add($addarr);
				}
				// 这可以写如果有数据则更新
			}

			
			// 当前页码条件判断是否拉取数据
			if( ($page['allPage'] - $page['pageIndex']) > 1 ){
				// 当前拉取数据记录
				$num = $this->calcul_num('line_num');
				$this->calcul_num('line_num', intval($num + $pageSize));
				// 下次为继续拉取数据
				$arr['ispull'] = true;
			}else{
				// ispull为停止拉取数据
				$arr['ispull'] = false;
			}
			
		}

		return $arr;
	}

	/**
     * 获取线上订单接口
     * @access public
     * @param string $pageSize 一页拉取多少条数据
     * @return array $arr 执行状态 status 是否拉取 ispull
     */
	public function de_Get_GoodsBillPaged( $pageSize = 10 ){
		// 接口名称
		$apiName = 'Get_GoodsBillPaged';
		// 拿取参数
		$set = $this->param;
		// 定义状态数组
		$arr = array(
			'status'=>true, // 执行状态
			'ispull'=>false // 是否拉取
			);


		// 获取单条数据
		$oneApiData = $this->openapi($apiName, array(
					'userAccount' => $set['account'],
					'where' => " 1=1 and Status = '1' ",
					'pageIndex' => 0,
					'pageSize' => $pageSize,
					'orderBy' => " SubmitTime asc",
				));
		// 计算当前需要拉取哪一页数据
		$page = $this->calculPage($oneApiData['total'], $apiName, $pageSize);


		// 循环拉取数据
		if($page['pageIndex'] < $page['allPage']){
			// 获取数据
			$apiData = $this->openapi($apiName, array(
					'userAccount' => $set['account'],
					'where' => " 1=1 and Status = '1' ",
					'pageIndex' => $page['pageIndex'],
					'pageSize' => $pageSize,
					'orderBy' => " SubmitTime asc",
				));
			// 对数据进行验证存在 和 保存
			$table = D('oco_online_consume');
			$time = date('Y-m-d H:i:s', time());
			foreach ($apiData['data'] as $ak => $av) {
				// 查询数据库有无该条数据
				$tabres = $table->where(array('Guid'=>$av['Guid']))->find();
				// 没有则添加
				if( empty($tabres) ){

					$addarr = $av;
					// 记录添加时间(拉取数据时间)
					$addarr['exestat'] = '1';
					$addarr['deaddtime'] = $time;
					$addarr['deedittime'] = $time;
					// 这个数据需要序列化一下
					$addarr['ItemList'] = serialize($av['ItemList']);
					// 保存数据
					$addres = $table->add($addarr);
				}
				// 这可以写如果有数据则更新
			}


			// 当前页码条件判断是否拉取数据
			if( ($page['allPage'] - $page['pageIndex']) > 1 ){
				// 当前拉取数据记录
				$num = $this->calcul_num('online_num');
				$this->calcul_num('online_num', intval($num + $pageSize));
				// 下次为继续拉取数据
				$arr['ispull'] = true;
			}else{
				// ispull为停止拉取数据
				$arr['ispull'] = false;
			}
		}

		return $arr;
	}

	/**
     * 获取工号(用户)列表
     * @access public
     * @param string $pageSize 一页拉取多少条数据
     * @return array $arr 执行状态 status 是否拉取 ispull
     */
	public function de_Get_UserAccountPaged( $pageSize = 10 ){
		// 接口名称
		$apiName = 'Get_UserAccountPaged';
		// 拿取参数
		$set = $this->param;
		// 定义状态数组
		$arr = array(
			'status'=>true, // 执行状态
			'ispull'=>false // 是否拉取
			);


		// 获取单条数据
		$oneApiData = $this->openapi($apiName, array(
					'userAccount' => $set['account'],
					'where' => '1=1',
					'pageIndex' => 0,
					'pageSize' => $pageSize,
					'orderBy' => " Guid asc", // 没有时间，只能用这个
				));
		// 计算当前需要拉取哪一页数据
		$page = $this->calculPage($oneApiData['totalCount'], $apiName, $pageSize);


		// 循环拉取数据
		if($page['pageIndex'] < $page['allPage']){
			// 获取数据
			$apiData = $this->openapi($apiName, array(
					'userAccount' => $set['account'],
					'where' => '1=1',
					'pageIndex' => $page['pageIndex'],
					'pageSize' => $pageSize,
					'orderBy' => " Guid asc", // 没有时间，只能用这个
				));
			// 对数据进行验证存在 和 保存
			$table = D('oco_useraccount');
			$time = date('Y-m-d H:i:s', time());
			foreach ($apiData['data'] as $ak => $av) {
				// 查询数据库有无该条数据
				$tabres = $table->where(array('Guid'=>$av['Guid']))->find();
				// 没有则添加
				if( empty($tabres) ){

					$addarr = $av;
					// 记录添加时间(拉取数据时间)
					$addarr['exestat'] = '1';
					$addarr['deaddtime'] = $time;
					$addarr['deedittime'] = $time;
					// 保存数据
					$addres = $table->add($addarr);
				}else{
					$table->where(array('Guid'=>$av['Guid']))->save($av
						);
				}
				// 这可以写如果有数据则更新
			}

			
			// 当前页码条件判断是否拉取数据
			if( ($page['allPage'] - $page['pageIndex']) > 1 ){
				// 当前拉取数据记录
				$num = $this->calcul_num('useraccount_num');
				$this->calcul_num('useraccount_num', intval($num + $pageSize));
				// 下次为继续拉取数据
				$arr['ispull'] = true;
			}else{
				// ispull为停止拉取数据
				$arr['ispull'] = false;
			}
		}

		return $arr;
	}

	/**
     * 获取店面列表
     * @access public
     * @param string $pageSize 一页拉取多少条数据
     * @return array $arr 执行状态 status 是否拉取 ispull
     */
	public function de_Get_ChainStorePagedV2( $pageSize = 10 ){
		// 接口名称
		$apiName = 'Get_ChainStorePagedV2';
		// 拿取参数
		$set = $this->param;
		// 定义状态数组
		$arr = array(
			'status'=>true, // 执行状态
			'ispull'=>false // 是否拉取
			);


		// 获取单条数据
		$oneApiData = $this->openapi($apiName, array(
					'userAccount' => $set['account'],
					'where' => '1=1',
					'pageIndex' => 0,
					'pageSize' => $pageSize,
					'orderBy' => " Guid asc", // 没有时间,只能用这个(或storeName)
				));
		// 计算当前需要拉取哪一页数据
		$page = $this->calculPage($oneApiData['total'], $apiName, $pageSize);


		// 循环拉取数据
		if($page['pageIndex'] < $page['allPage']){
			// 获取数据
			$apiData = $this->openapi($apiName, array(
					'userAccount' => $set['account'],
					'where' => '1=1',
					'pageIndex' => $page['pageIndex'],
					'pageSize' => $pageSize,
					'orderBy' => " Guid asc", // 没有时间,只能用这个(或storeName)
				));
			// 对数据进行验证存在 和 保存
			$table = D('oco_chainstore');
			$time = date('Y-m-d H:i:s', time());
			foreach ($apiData['data'] as $ak => $av) {
				// 查询数据库有无该条数据
				$tabres = $table->where(array('Guid'=>$av['Guid']))->find();
				// 没有则添加
				if( empty($tabres) ){

					$addarr = $av;
					// 记录添加时间(拉取数据时间)
					$addarr['exestat'] = '1';
					$addarr['deaddtime'] = $time;
					$addarr['deedittime'] = $time;
					// 保存数据
					$addres = $table->add($addarr);
				}else{
				// 这可以写如果有数据则更新
					$table->where(array('Guid'=>$av['Guid']))->save($av);
				}
			}


			// 当前页码条件判断是否拉取数据
			if( ($page['allPage'] - $page['pageIndex']) > 1 ){
				// 当前拉取数据记录
				$num = $this->calcul_num('chainstore_num');
				$this->calcul_num('chainstore_num', intval($num + $pageSize));
				// 下次为继续拉取数据
				$arr['ispull'] = true;
			}else{
				// ispull为停止拉取数据
				$arr['ispull'] = false;
			}
		}

		return $arr;
	}

	/**
     * 增加/扣除积分
     * @access public
     * @param array $arr 需传入字段有cardid point meno
     * @return array $arr 执行状态
     */
	public function de_Update_MemberPoint( $arr = array() ){
		// 接口名称
		$apiName = 'Update_MemberPoint';
		// 拿取参数
		$set = $this->param;
		
		// 调用接口增加和减少积分
		$oneApiData = $this->openapi($apiName, array(
					'userAccount' => $set['account'],
					'cardId' => $arr['cardid'],
					'point' => $arr['point'],
					'meno' => $arr['meno'],
				));

		// 结果
		if($oneApiData['status'] == 0){
			return true;
		}else{
			return false;
		}

	}

	/**
     * 根据第三方平台标识获取会员唯一标识
     * @access public
     * @param array $arr 需传入字段有 deviceType thirdOpenId
     * @return array $oneApiData 执行后的数据
     */
	public function de_GetMemberGuidByOpenId( $arr = array() ){
		// 接口名称
		$apiName = 'GetMemberGuidByOpenId';
		
		// 调用接口增加和减少积分
		$oneApiData = $this->openapi($apiName, array(
					'deviceType' => $arr['deviceType'],
					'thirdOpenId' => $arr['thirdOpenId'],
				));

		return $oneApiData;

	}

}
